from django.shortcuts import render
from django.http import HttpResponse
from book.models import BookInfo
# Create your views here.
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

"""
book = BookInfo(
    bookName="C++程序设计",
    pub_date="2001-1-1",
    readCount=11
)
"""

# 方式一
# 必须要调用 对象的save方法才能将数据保存到数据库中
# book.save()

# 方式二
# 模型名.objects.create()
BookInfo.objects.create(
    bookName="C语言程序设计",
    pub_date="2002-1-1",
    readCount=20
)

# 修改数据 方式一:
# select * from bookinfo where id=6
book = BookInfo.objects.get(id=10)
book.bookName = "运维开发入门"
# 需要使用保存数据用save
book.save()

# 修改数据 方式二
BookInfo.objects.filter(id=10).update(bookName="编程圣经",commentCount=100)

# 删除数据 方式一
book = BookInfo.objects.get(id=10)
book.delete()
# 删除分两种方式
   # -- 物理删除(这条记录从此消失,后果很严重)
   # -- 逻辑删除(修改数据记录的标记位,例如 is_delete=false)

# 删除数据 方式2
BookInfo.objects.filter(id=12).delete()
BookInfo.objects.get(id=14).delete()

# get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常
try:
        book=BookInfo.objects.get(id=1)
except BookInfo.DoesNotExist:
    print("查询结果不存在")

# all查询多个结果
BookInfo.objects.all()
from book.models import PeopleInfo
PeopleInfo.objects.all()

# 查询结果的数量
BookInfo.objects.all().count()
BookInfo.objects.count()

# Django中的过滤查询
# 实现SQL中的where的功能,包括
# filter  过滤出多个结果
# exclude 排除掉符合条件剩下的结果
# get     过滤单一结果

# 模型名.object.filter(属性名__运算符=值)
# 模型名.object.exclude(属性名__运算符=值)
# 模型名.object.get(属性名__运算符=值)

"""
查询编号为1的图书
    >>> type(BookInfo.objects.get(pk__exact=1))
    <class 'book.models.BookInfo'>
    >>> type(BookInfo.objects.filter(pk__exact=1))
    <class 'django.db.models.query.QuerySet'>

    BookInfo.object.get(id=1)
    BookInfo.object.get(pk=1)
    BookInfo.object.get(pk__exact=1)

查询书名包含'湖'的图书
    BookInfo.objects.filter(bookName__contains="湖")
    
查询书名以'部'结尾的图书
    BookInfo.objects.filter(bookName__endswith='部')

查询书名为空的图书
    BookInfo.objects.filter(bookName__isnull=True)

查询书名为1或3或5的图书
    BookInfo.objects.filter(id__in=[1,3,5])

查询编号大于3的图书
    BookInfo.objects.filter(id__gte=3)
    
查询编号不等于3的图书
    BookInfo.objects.exclude(pk=3)
    
查询1980年发表的图书
    BookInfo.objects.filter(pub_date__year="1980")
    
查询1990年1月1日后发表的图书
    BookInfo.objects.filter(pub_date__gt="1990-01-01")
    BookInfo.objects.filter(pub_date__gt="1990-01-01")
"""
from django.db.models import F
# 查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readCount__gte=F('commentCount'))

# 逻辑与查询
# 查询阅读量大于20,并且编号小于3的图书.
BookInfo.objects.filter(readCount__gt=20).filter(pk__gt=3)
BookInfo.objects.filter(readCount__gt=20,pk__lt=3)

# 逻辑或查询
# 查询阅读量大于20,或者编号小于3的图书.
from django.db.models import Q

# 或者语法: 模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值))
BookInfo.objects.filter(Q(readCount__gt=20) | Q(pk__lt=3))

# 逻辑非
# 查询编号不等于3的图书
BookInfo.objects.filter(~Q(pk=3))

# 聚合函数
from django.db.models import Sum,Max,Min,Avg,Count

# 模型类名.objects.aggregate(函数(”字段名"))
BookInfo.objects.aggregate(Sum('readCount'))

# 排序
# 升序
BookInfo.objects.all().order_by('readCount')
# 降序
BookInfo.objects.all().order_by('-readCount')
